---
title: 전송 방식
description: Learn about the different transport layers that can be used with Realtime Agents.
---

import { Steps } from '@astrojs/starlight/components';
import { Code } from '@astrojs/starlight/components';

import createAgentExample from '../../../../../../../examples/docs/voice-agents/createAgent.ts?raw';
import multiAgentsExample from '../../../../../../../examples/docs/voice-agents/multiAgents.ts?raw';
import createSessionExample from '../../../../../../../examples/docs/voice-agents/createSession.ts?raw';
import configureSessionExample from '../../../../../../../examples/docs/voice-agents/configureSession.ts?raw';
import handleAudioExample from '../../../../../../../examples/docs/voice-agents/handleAudio.ts?raw';
import defineToolExample from '../../../../../../../examples/docs/voice-agents/defineTool.ts?raw';
import toolApprovalEventExample from '../../../../../../../examples/docs/voice-agents/toolApprovalEvent.ts?raw';
import guardrailsExample from '../../../../../../../examples/docs/voice-agents/guardrails.ts?raw';
import guardrailSettingsExample from '../../../../../../../examples/docs/voice-agents/guardrailSettings.ts?raw';
import audioInterruptedExample from '../../../../../../../examples/docs/voice-agents/audioInterrupted.ts?raw';
import sessionInterruptExample from '../../../../../../../examples/docs/voice-agents/sessionInterrupt.ts?raw';
import sessionHistoryExample from '../../../../../../../examples/docs/voice-agents/sessionHistory.ts?raw';
import historyUpdatedExample from '../../../../../../../examples/docs/voice-agents/historyUpdated.ts?raw';
import updateHistoryExample from '../../../../../../../examples/docs/voice-agents/updateHistory.ts?raw';
import customWebRTCTransportExample from '../../../../../../../examples/docs/voice-agents/customWebRTCTransport.ts?raw';
import websocketSessionExample from '../../../../../../../examples/docs/voice-agents/websocketSession.ts?raw';
import sipTransportExample from '../../../../../../../examples/docs/voice-agents/sipTransport.ts?raw';
import transportEventsExample from '../../../../../../../examples/docs/voice-agents/transportEvents.ts?raw';
import thinClientExample from '../../../../../../../examples/docs/voice-agents/thinClient.ts?raw';
import cloudflareTransportExample from '../../../../../../../examples/docs/extensions/cloudflare-basic.ts?raw';

## 기본 전송 계층

### WebRTC 연결

기본 전송 계층은 WebRTC를 사용합니다. 마이크에서 오디오를 녹음하고 자동으로 재생합니다.

자체 미디어 스트림 또는 오디오 요소를 사용하려면 세션을 생성할 때 `OpenAIRealtimeWebRTC` 인스턴스를 제공하세요.

<Code lang="typescript" code={customWebRTCTransportExample} />

### WebSocket 연결

WebRTC 대신 WebSocket 연결을 사용하려면 세션을 생성할 때 `transport: 'websocket'` 또는 `OpenAIRealtimeWebSocket` 인스턴스를 전달하세요. 이는 예를 들어 Twilio로 전화 에이전트를 구축하는 등 서버 측 사용 사례에 적합합니다.

<Code lang="typescript" code={websocketSessionExample} />

원시 PCM16 오디오 바이트 처리를 위해 임의의 녹음/재생 라이브러리를 사용하세요.

### SIP 연결

`OpenAIRealtimeSIP` 전송을 사용하여 Twilio와 같은 제공업체의 SIP 통화를 브리지하세요. 이 전송은 통신사에서 발생하는 SIP 이벤트와 Realtime 세션을 동기화합니다.

1. `OpenAIRealtimeSIP.buildInitialConfig()`로 초기 세션 구성을 생성해 수신 전화를 수락합니다. 이렇게 하면 SIP 초대와 Realtime 세션이 동일한 기본값을 공유합니다.
2. `OpenAIRealtimeSIP` 전송을 사용하는 `RealtimeSession`을 연결하고, 제공업체 웹훅에서 발급된 `callId`로 접속합니다.
3. 세션 이벤트를 수신해 콜 분석, 전사, 에스컬레이션 로직을 구동합니다.

<Code lang="typescript" code={sipTransportExample} />

#### Cloudflare Workers (workerd) 참고

Cloudflare Workers 및 기타 workerd 런타임은 전역 `WebSocket` 생성자를 사용해 아웃바운드 WebSocket을 열 수 없습니다. 확장 패키지의 Cloudflare 전송을 사용하세요. 이 전송은 내부적으로 `fetch()` 기반 업그레이드를 수행합니다.

<Code lang="typescript" code={cloudflareTransportExample} />

### 자체 전송 메커니즘 구축

다른 음성-대-음성 API를 사용하거나 사용자 정의 전송 메커니즘이 필요한 경우, `RealtimeTransportLayer` 인터페이스를 구현하고 `RealtimeTransportEventTypes` 이벤트를 발생시켜 직접 만들 수 있습니다.

## Realtime API 직접 상호작용

OpenAI Realtime API를 사용하면서 Realtime API에 더 직접적으로 접근하려면 두 가지 옵션이 있습니다.

### 옵션 1 - 전송 계층 접근

`RealtimeSession`의 모든 기능을 활용하면서도 전송 계층에 접근하려면 `session.transport`를 사용하세요.

전송 계층은 수신한 모든 이벤트를 `*` 이벤트로 내보내며, `sendEvent()` 메서드로 원시 이벤트를 전송할 수 있습니다.

<Code lang="typescript" code={transportEventsExample} />

### 옵션 2 — 전송 계층만 사용

자동 도구 실행, 가드레일 등이 필요 없다면, 연결 및 인터럽션(중단 처리)만 관리하는 "얇은" 클라이언트로 전송 계층을 사용할 수 있습니다.

<Code lang="typescript" code={thinClientExample} />
